<?php


ob_implicit_flush(true);
echo "Program starts at " . date('h:i:s') . ".\n";

$time = 0;
$time_exec = microtime(true);
$timeout = 10;
$result = array();
$sockets = array();
$writes = array();
$convenient_read_block = 8192;

/* Выполнить одновременно все запросы; ничего не блокируется. */
$delay = 15;
$id = 0;
while ($delay > 0) {
    for ($i = 0; $i < 100; $i++) {
        $s = stream_socket_client("213.180.204.3:80", $errno, $errstr, $timeout, STREAM_CLIENT_ASYNC_CONNECT | STREAM_CLIENT_CONNECT);
        //usleep(100000);
        if ($s) {
            $writes[$id] = false;
            $result[$id] = '';
            $sockets[$id++] = $s;
        } else {
            echo "Stream " . $id . " failed to open correctly.";
        }
    }
    $delay -= 3;
}
while (count($sockets)) {
    $read = $sockets;
    $write = $sockets;
    $time1 = microtime(true);
    //$read = null; $w = null; $e = null;
    stream_select($read, $write, $e = null, 0.1);
    //var_dump(array($read, $write, $e));
    $time2 = microtime(true);
    $time += ($time2 - $time1);
    if (count($write)) {
        /* stream_select обычно перемешивает $read, поэтому мы должны вычислить,
          из какого сокета выполняется чтение. */
        foreach ($write as $w) {
            $id = array_search($w, $sockets);
            if (false === $writes[$id]) {
                $http_message = "GET / HTTP/1.0\r\nHost: ya.ru\r\n\r\n";
                fwrite($sockets[$id], $http_message);
                $writes[$id] = true;
            }
        }
    }

    if (count($read)) {
        /* stream_select обычно перемешивает $read, поэтому мы должны вычислить,
          из какого сокета выполняется чтение. */
        foreach ($read as $r) {
            $id = array_search($r, $sockets);
            $data = fread($r, $convenient_read_block);
            /* Сокет можно прочитать либо потому что он
              имеет данные для чтения, ЛИБО потому что он в состоянии EOF. */
            //var_dump($data);
            if (strlen($data) == 0) {
                echo "Stream " . $id . " closes at " . date('h:i:s') . ".<br />\n";
                var_dump(strlen($result[$id]));
                fclose($r);
                unset($sockets[$id]);
            } else {
                $result[$id] .= $data;
            }
        }
    } else {
        /* Таймаут означает, что *все* потоки не
          дождались получения ответа. */
        //echo "Time-out!<br>\n";
        //break;
    }
}
$time_exec = microtime(true) - $time_exec;
echo 'Time: ' . $time . '<br>';
echo 'Time exec: ' . $time_exec;
?>